Skip to main content

孤儿进程 僵尸进程 守护进程

孤儿进程,僵尸进程(及解决方法),守护进程讲解

孤儿进程:

父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”此时的子进程叫做孤儿进程。====爹没了。 Linux避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。====init养父

僵尸进程:

创建子进程后,子进程退出状态不被收集,变成僵尸进程。爹不要它了 除非爹死后变孤儿init养父接收。如果父进程是死循环,那么该僵尸进程就变成游魂野鬼消耗空间。

守护进程:

守护进程(Daemon)是在一类脱离终端在后台执行的程序, 通常以 d 结尾, 随系统启动, 其父进程 (ppid) 通常是init 进程。====后台小天使

孤儿进程有危害吗?

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

僵尸进程有危害吗?

僵尸进程危害场景:“擒贼先擒王”。 例如有个进程,它定期的产生一个子进程,这个子进程需要做的事情很少,做完它该做的事情之后就退出了,因此这个子进程的生命周期很短,但是,父进程只管生成新的子进程,至于子进程 退出之后的事情,则一概不闻不问,这样,系统运行上一段时间之后,系统中就会存在很多的僵死进程,倘若用ps命令查看的话,就会看到很多状态为Z的进程。 严格地来说,僵死进程并不是问题的根源,罪魁祸首是产生出大量僵死进程的那个父进程。因此,当我们寻求如何消灭系统中大量的僵死进程时,答案就是把产生大量僵死进程的那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。枪毙了元凶进程(父进程)之后,它产生的僵死进程就变成了孤儿进程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源,这样,这些已经僵死的孤儿进程 就能瞑目而去了。这就是守护进程的作用,如果发生大量的僵尸进程,守护进程就会查找其父进程,然后无情的kill掉!

什么要尽量避免僵尸进程?

首先要明白,僵尸进程不是活着的进程,可以说就是一个数据结构,它是已经完成的任务的进程,但是不是它完成任务后就会烟消云散的,他会留下一点东西,这个东西就是他的进程Id,他的结束状态等,为什么了留下这个东西呢?因为这个是用来向他的父进程报告自己的完成状况用的,想想父进程为什么会创建一个进程,是用来完成任务的,父进程需要知道子进程的完成情况,所有出现这样的机制,对于僵尸进程只有父进程自己可以清理掉,调用wait等命令。就可以了。但是父进程不清理咋办,那么就说明僵尸进程存在,浪费了进程Id,进程的id是一种有限资源,用一个少一个啊,所以如果大量的僵尸进程存在的话,解决方法可以是杀掉无良的爹,孩子就可以被收养了。所以说,系统中的进程数量是有限的,虽然僵尸进程占用的资源和内存都比较少,但是它却占领着数字,可能会导致系统无法再创建新的进程,因此及时清除僵尸进程很重要!

补充:

Linux中的常见命令: 用于文件操作的常见命令:

cp(拷贝)、rm(删除)、mkdir(创建)、cd(切换目录)、mv(改名)、ls(罗列文件/文件夹)、tar(解压缩)、chmod(更改权限)、chown(更改所有者) 用于系统进程操作的常见命令: top/htop(查看系统中所有进程实时运行情况)、ps(列出系统中的进程)、lsof(查看某个端口是否被占用)、kill(杀死某个进程)、iotop(监控磁盘I/O情况)、ifconfig(查看本机IP)